// 导入所需模块
const { OpenAI } = require('openai');
const dotenv = require('dotenv');

// 加载环境变量
dotenv.config();

class DeepseekService {
    constructor() {
        // 检查环境变量
        if (!process.env.DEEPSEEK_API_KEY) {
            console.warn('警告: DEEPSEEK_API_KEY 未配置');
        }

        // 初始化 OpenAI 客户端
        this.client = new OpenAI({
            baseURL: process.env.DEEPSEEK_API_URL || 'https://api.deepseek.com',
            apiKey: process.env.DEEPSEEK_API_KEY
        });
    }

    /**
     * 调用 DeepSeek API 进行文档审核
     * @param {string} content - 需要审核的文档内容
     * @param {string} promptTemplate - 可选的提示词模板
     * @param {string} modelID - 模型ID，默认为deepseek-reasoner
     * @returns {Promise<Object>} - 返回审核结果
     */
    async reviewDocument(content, promptTemplate = null, modelID = "deepseek-reasoner") {
        try {
            // 如果未提供 API 密钥，返回模拟响应
            if (!process.env.DEEPSEEK_API_KEY) {
                console.warn('API密钥未配置，返回模拟响应');
                return {
                    result: "模拟审核结果：请先配置 API 密钥",
                    thinking: "模拟思考过程"
                };
            }

            // 构建默认提示词模板
            const defaultTemplate = `##角色:你是一位经验丰富的技术文档审核专家。
##任务:请仔细审核以下文档内容，评估其质量、完整性和专业性，并提供改进建议。

{content}

请从以下几个方面进行评审：
1. 文档结构与组织：评估文档的整体结构是否清晰、逻辑性强
2. 技术内容准确性：检查技术描述是否准确，术语使用是否正确
3. 完整性：评估文档是否包含所有必要的信息
4. 可读性：考察文档的语言表达、格式和排版
5. 改进建议：提供具体的改进建议

请首先进行深入思考，然后给出评审结果。评审结果应简明扼要，重点突出需要改进的地方。`;

            // 使用提供的模板或默认模板
            const finalPrompt = (promptTemplate || defaultTemplate).replace('{content}', content);

            // 调用 DeepSeek API
            const response = await this.client.chat.completions.create({
                model: modelID,  // 使用传入的模型ID
                messages: [
                    { role: "user", content: finalPrompt }
                ],
                max_tokens: 4096  // 设置较大的 token 限制以获取完整响应
            });

            // 提取响应结果
            if (response.choices && response.choices.length > 0) {
                const result = {
                    result: response.choices[0].message.content,
                    thinking: response.choices[0].message.reasoning_content || "分析过程已包含在结果中"
                };
                return result;
            } else {
                throw new Error('API 响应格式异常');
            }

        } catch (error) {
            console.error('调用 DeepSeek API 失败:', error);
            throw error;
        }
    }

    /**
     * 执行聊天完成请求
     * @param {Array} messages - 对话历史消息列表
     * @param {Object} options - 可选参数
     * @returns {Promise<Object>} - 返回聊天响应
     */
    async chatCompletion(messages, options = {}) {
        try {
            const {
                model = "deepseek-chat",
                maxTokens = 2048,
                stream = false
            } = options;

            // 验证消息格式
            if (!Array.isArray(messages) || messages.length === 0) {
                throw new Error('无效的消息格式');
            }

            // 调用 API
            const response = await this.client.chat.completions.create({
                model,
                messages,
                max_tokens: maxTokens,
                stream
            });

            // 处理流式响应
            if (stream) {
                return response;
            }

            // 处理普通响应
            if (response.choices && response.choices.length > 0) {
                return {
                    content: response.choices[0].message.content,
                    reasoning_content: response.choices[0].message.reasoning_content
                };
            } else {
                throw new Error('API 响应格式异常');
            }

        } catch (error) {
            console.error('聊天请求失败:', error);
            throw error;
        }
    }

    /**
     * 检查 API 状态
     * @returns {Promise<Object>} - 返回状态信息
     */
    async checkStatus() {
        try {
            return {
                status: "正常",
                api_key: process.env.DEEPSEEK_API_KEY ? "已配置" : "未配置",
                timestamp: Date.now()
            };
        } catch (error) {
            console.error('状态检查失败:', error);
            throw error;
        }
    }
}

// 导出服务类
module.exports = DeepseekService; 